/**
 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Autogenerated file -- DO NOT EDIT!

namespace builtins {

// NOLINTNEXTLINE(readability-function-size)
inline bool CanEncodeAmd64(IntrinsicId id)
{
    switch (id) {
% Compiler::intrinsics.select {|intrinsic| intrinsic.codegen_arch.include? 'amd64'}.each do |intrinsic|
        case IntrinsicId::<%= intrinsic.entrypoint_name %>:
            return true;
% end
        default:
            return false;
    }
}

// NOLINTNEXTLINE(readability-function-size)
inline bool CanEncodeArm64(IntrinsicId id)
{
    switch (id) {
% Compiler::intrinsics.select {|intrinsic| intrinsic.codegen_arch.include? 'arm64'}.each do |intrinsic|
        case IntrinsicId::<%= intrinsic.entrypoint_name %>:
            return true;
% end
        default:
            return false;
    }
}

// NOLINTNEXTLINE(readability-function-size)
inline bool CanEncodeArm32(IntrinsicId id)
{
    switch (id) {
% Compiler::intrinsics.select {|intrinsic| intrinsic.codegen_arch.include? 'arm32'}.each do |intrinsic|
        case IntrinsicId::<%= intrinsic.entrypoint_name %>:
            return true;
% end
        default:
            return false;
    }
}

inline bool CheckRestrictions([[maybe_unused]] RuntimeInterface *runtime, IntrinsicId id, [[maybe_unused]] Arch arch)
{
    switch (id) {
% Compiler::intrinsics.select {|intrinsic| intrinsic.respond_to? 'can_encode_func'}.each do |intrinsic|
        case IntrinsicId::<%= intrinsic.entrypoint_name %>:
            return <%= intrinsic.can_encode_func %>(runtime, arch);
% end
        default:
            return true;
    }
}

}  // namespace builtins

inline bool EncodesBuiltin(RuntimeInterface *runtime, IntrinsicId id, Arch arch)
{
    if (!options.IsCompilerEncodeIntrinsics()) {
        return false;
    }
    if (!builtins::CheckRestrictions(runtime, id, arch)) {
        return false;
    }
    switch (arch) {
        case Arch::AARCH64:
            return builtins::CanEncodeArm64(id);
        case Arch::AARCH32:
            return builtins::CanEncodeArm32(id);
        case Arch::X86_64:
            return builtins::CanEncodeAmd64(id);
        default:
            UNREACHABLE();
    }
}

inline bool EncodesBuiltin(RuntimeInterface *runtime, RuntimeInterface::IntrinsicId id, Arch arch)
{
    return EncodesBuiltin(runtime, static_cast<IntrinsicId>(id), arch);
}
